# 导入ROS Python库
import rospy
# 导入actionlib库用于创建动作客户端
import actionlib
# 从自定义包导入动作消息类型
from action_communication.msg import *

# 完成回调函数（当动作最终完成时触发）
def done_cb(states, result):
    """
    API参数说明：
    - states: actionlib.GoalStatus 对象，表示最终状态
    - result: setarpResult 消息对象，包含服务端返回的结果
    """
    if states == actionlib.GoalStatus.SUCCEEDED:  # 动作成功完成
        if result.result:  # 解析结果布尔值
            rospy.loginfo("检测完成")
        else :
            rospy.loginfo("检测未完成")
    else :  # 其他状态（ABORTED/PREEMPTED等）
        rospy.loginfo("响应失败")

# 连接激活回调函数（当服务端接受目标时触发）
def active_cb():
    rospy.loginfo("开始检测")

# 进度反馈回调函数（周期接收服务端反馈）
def feedback_cb(feedback):
    """
    API参数说明：
    - feedback: setarpFeedback 消息对象，包含进度信息
    """
    rospy.loginfo("当前进度: %2.1f%%", feedback.progress_bar)

if __name__ == "__main__":
    # ROS节点初始化
    rospy.init_node("client_action")  # 创建名为client_action的节点
    
    # 创建动作客户端（与服务端动作名称和类型必须匹配）
    """
    API: actionlib.SimpleActionClient
    参数说明：
    - "action_p": 服务端注册的动作名称
    - setarpAction: 动作消息类型（自动生成的Python类）
    """
    client = actionlib.SimpleActionClient("action_p", setarpAction)
    
    # 阻塞等待直到服务端上线
    client.wait_for_server()  # 可选超时参数：wait_for_server(rospy.Duration(5))
    
    # 创建目标请求对象
    goal = setarpGoal()
    goal.goal = 100  # 设置目标检测100个零件
    
    # 发送目标请求并绑定回调函数
    """
    API: send_goal 方法参数说明：
    - goal: 目标请求对象
    - done_cb: 完成回调（必需）
    - active_cb: 连接激活回调（可选）
    - feedback_cb: 进度反馈回调（可选）
    """
    client.send_goal(goal, done_cb, active_cb, feedback_cb)
    
    # 保持节点运行以接收回调
    rospy.spin()  # 进入ROS事件循环